class Solution {
    public String minWindow(String s, String t) {
        int[] hash=new int[128];
        int[] hash1=new int[128];
        int m=s.length();
        int n=t.length();

        int kinds=0;    //种类

        for(int i=0;i<n;i++){
            char ch=t.charAt(i);
            if(hash[ch]==0){
                kinds++;
            }
            hash[ch]++;
        }

        int left=0,right=0;
        int count=0;
        int len=Integer.MAX_VALUE,begin=-1;

        while(right<m){
            //入窗口
            char ch1=s.charAt(right);
            hash1[ch1]++;
            if(hash1[ch1]==hash[ch1]){
                count++;
            }
            //判断是否要出窗口
            while(count==kinds){
                //更新数据
                if(right-left+1<len){
                    len=right-left+1;
                    begin=left;
                }
                //出窗口
                char ch2=s.charAt(left);
                left++;
                //如果原来left位置是t串中的数据就--
                if(hash1[ch2]==hash[ch2]){
                    count--;
                }
                //无论是不是t中的数据，都需要--（因为已经出窗口了）
                hash1[ch2]--;
            }
            right++;
        }
        //System.out.println(begin);
        if(begin == -1) return new String();
        else return s.substring(begin, begin + len);
    }
}